package com.choosefine.it.cprivilege.service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.choosefine.it.base.dto.PageDTO;
import com.choosefine.it.common.def.CommonConstant;
import com.choosefine.it.common.def.ResultCode;
import com.choosefine.it.common.exception.BusinessException;
import com.choosefine.it.cprivilege.dao.AccountRoleMapper;
import com.choosefine.it.cprivilege.dao.RoleMapper;
import com.choosefine.it.cprivilege.dao.RoleMenuMapper;
import com.choosefine.it.cprivilege.model.ConsoleRole;
import com.choosefine.it.cprivilege.model.dto.RoleAccountDTO;
import com.choosefine.it.cprivilege.model.dto.RoleMenuDTO;
import com.choosefine.it.cprivilege.model.vo.AccountVO;
import com.choosefine.it.cprivilege.model.vo.RoleMenuVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;

/**
 * 角色业务层
 * 
 * Author：liaozhanggen
 * Create Date：2017年2月16日
 * Version：v2.0
 */
@Service
public class RoleService {

	@Autowired
	private RoleMapper roleMapper;
	@Autowired
	private RoleMenuMapper roleMenuMapper;
	@Autowired
	private AccountRoleMapper accountRoleMapper;

	/**
	 * 添加角色 
	 * @throws BusinessException 
	* @Author：liaozhanggen
	* @Create Date：2017年2月16日
	* @return：int
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public int saveRole(RoleMenuDTO roleMenuDTO) throws BusinessException{
		
		ConsoleRole role = new ConsoleRole(roleMenuDTO.getRoleName());
		
		//判断角色名称是否存在
		int flag = roleMapper.findRoleNameIsExists(role);
		if (flag > 0) {
			throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.DATA_IS_EXISTS_SYSTEM, roleMenuDTO.getRoleName()));
		}
		
		//添加角色
		int num  = roleMapper.insertRole(role);
		if (num == 0) {
			return num;
		}
		//添加角色的权限 
		if (num > 0 && !StringUtils.isEmpty(roleMenuDTO.getMenuIds())) {
			List<String> menuIds = Arrays.asList(roleMenuDTO.getMenuIds().split(","));
			for (String menuId : menuIds) {
				Integer.parseInt(menuId); //校验数据类型是否正确
			}
			Map<String, Object> param = new HashMap<>();
			param.put("roleId", role.getId());
			param.put("menus", menuIds);
			//添加权限
			num = roleMenuMapper.insertRoleMenu(param);
		}
		role = null;
		return num;
	}
	
	/**
	 * 更新角色信息
	 * @param id 
	 * @throws BusinessException 
	 *
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月16日
	 * @param：....
	 * @return：int
	 */
	@Transactional(propagation=Propagation.REQUIRED,readOnly=false)
	public int updateRole(RoleMenuDTO roleMenuDTO, int id) throws BusinessException{
		ConsoleRole role = new ConsoleRole(roleMenuDTO.getRoleName());
		role.setId(id);
		
		//判断角色名称是否存在
		int flag = roleMapper.findRoleNameIsExists(role);
		if (flag > 0) {
			throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.DATA_IS_EXISTS_SYSTEM, roleMenuDTO.getRoleName()));
		}
		
		//修改角色
		int num  = roleMapper.updateRole(role);
		if (num == 0) {
			return num;
		}
		//修改角色对应的菜单权限
		if (num > 0 && !StringUtils.isEmpty(roleMenuDTO.getMenuIds())) {
			List<String> menuIds = Arrays.asList(roleMenuDTO.getMenuIds().split(","));
			try {
				for (String menuId : menuIds) {
					Integer.parseInt(menuId); //校验数据类型是否正确
				}
			} catch (NumberFormatException e) {
				throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.COMMON_IS_VALID, "MenuIds"));
			}
			//删除已经拥有的菜单权限
			num = roleMenuMapper.deleteOwnerMenuByRoleId(role.getId());
			
			Map<String, Object> param = new HashMap<>();
			param.put("roleId", role.getId());
			param.put("menus", menuIds);
			//添加权限
			num = roleMenuMapper.insertRoleMenu(param);
		}
		return num;
	}
	
//	/**
//	 * 根据id查询角色信息
//	 *
//	 * @Author：liaozhanggen
//	 * @Create Date：2017年2月16日
//	 * @param：....
//	 * @return：ConsoleRole
//	 */
//	@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
//	public ConsoleRole findRoleById(ConsoleRole role){
//		
//		return roleMapper.findRoleById(role.getId());
//	}

	/**
	 * 角色分页查询
	 *
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月16日
	 * @param：....
	 * @return：Page<ConsoleRole>
	 */
	@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
	public Page<ConsoleRole> queryRolePage(PageDTO pageDTO,String roleName){
		ConsoleRole role = new ConsoleRole(roleName);
		PageHelper.startPage(pageDTO.getPageNum(), pageDTO.getPageSize());
		Page<ConsoleRole> rolePage = roleMapper.queryRolePage(role);
		role = null;
		return rolePage;
	}

	/** 
	 * 查询角色下的菜单关系信息
	 * 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月17日
	 * @param：....
	 * @return：Object
	 */
	public RoleMenuVO queryOwnerMenuByRoleId(int id) {
		return roleMapper.queryOwnerMenuByRoleId(id);
	}

	/** 
	 * 删除角色
	 * @throws BusinessException 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月17日
	 * @param：....
	 * @return：int
	 */
	public int deleteRole(int id) throws BusinessException {
		// 判断角色与帐户 是否有依赖
		int num = accountRoleMapper.validRoleAccIsExists(id);
		if (num > 0) {
			throw new BusinessException(ResultCode.FAILED, CommonConstant.ROLE_ACCOUNT_IS_EXISTS);
		}
		return roleMapper.deleteRole(id);
	}

	/** 
	 * 角色添加对应的成员管理
	 * 
	 * @throws BusinessException 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月20日
	 * @param：....
	 * @return：int
	 */
	public int addRoleAccount(RoleAccountDTO roleAccountDTO) throws BusinessException {
		if (roleAccountDTO.getRoleId()== 0) {
			throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.COMMON_IS_VALID, "Role"));
		}
		//允许成员为空
		List<String> memberList = Arrays.asList(roleAccountDTO.getMembers().split(","));
		if (null == roleAccountDTO.getMembers() || "".equals(roleAccountDTO.getMembers().trim())) {
//			throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.COMMON_IS_VALID, "Members"));
			memberList = null;
		}else{
			try {
				for (String member : memberList) { //判断成员是否有效
					Integer.parseInt(member);
				}
			} catch (NumberFormatException e) {
				throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.COMMON_IS_VALID, "Members"));
			}
		}
			
		//删除之前角色与成员的关系
		Map<String, Object> param = new HashMap<>();
		param.put("roleId", roleAccountDTO.getRoleId());
		int num = accountRoleMapper.deleteRoleAccountByRoleId(param);
		if (null != memberList) { //如果成员为空就不作此操作动作
			//角色添加对应的成员管理
			param.put("members", memberList);
			num = accountRoleMapper.insertRoleAccount(param);
		}
		return num;
	}

	/** 
	 * 查询指定角色的对应成员-无分页
	 * 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月20日
	 * @param：....
	 * @return：List<AccountVO>
	 */
	public List<AccountVO> queryRoleAccount(int roleId) {
		return accountRoleMapper.queryRoleAccount(roleId);
	}
}